博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义标签开发库
阅读量:5235 次
发布时间:2019-06-14

本文共 33245 字,大约阅读时间需要 110 分钟。

一、自定义标签开发库简介

  

 

  Tag接口的方法:

     

 

二、自定义标签入门:输出客户机ip

1.编写一个实现tag接口的java类

  • ViewIPTag.java

1 package com.web.tag; 2  3 import java.io.IOException; 4  5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.JspWriter; 8 import javax.servlet.jsp.tagext.TagSupport; 9 10 //Tag接口实现类11 public class ViewIPTag extends TagSupport{12     @Override13     public int doStartTag() throws JspException {14     15         HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();16         JspWriter out = this.pageContext.getOut();17         18         19         String ip = request.getRemoteAddr();20         try {21             out.print(ip);22         } catch (IOException e) {23             throw new RuntimeException(e);24         }25         26         return super.doStartTag();27     }28 }

    

2.在tld文件中对标签处理器类进行描述(tld文件的位置:WEB-INF下,可以抄apache-tomcat/webapps\examples\WEB-INF\jsp2\jsp2-example-taglib.tld)com.tld:这个文件放在WEB-INF目录下

  • tld文件:    

1 
5 6
A tag library exercising SimpleTag handlers.
7
1.0
8
com
9
http://www.sina.cn
10 11 12
13
viewIP
14
com.web.tag.ViewIPTag
15
empty
16
17 18

 

3.在jsp页面中导入和使用自定义标签

  • 1.jsp 

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="http://www.sina.cn" prefix="com" %> 
3 4 5 6
7 Insert title here 8 9 10 您的ip:
11 12

 

三、Tag接口的执行流程

 

   

  自定义标签调用图:

    

 

 

  

   jsp翻译成servlet部分源代码:

    

1    out.write("    您的ip是:"); 2       if (_jspx_meth_com_005fviewIP_005f0(_jspx_page_context)) 3         return; 4       out.write("\r\n"); 5       out.write("  \r\n"); 6       out.write("\r\n"); 7     } catch (java.lang.Throwable t) { 8       if (!(t instanceof javax.servlet.jsp.SkipPageException)){ 9         out = _jspx_out;10         if (out != null && out.getBufferSize() != 0)11           try {12             if (response.isCommitted()) {13               out.flush();14             } else {15               out.clearBuffer();16             }17           } catch (java.io.IOException e) {}18         if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);19         else throw new ServletException(t);20       }21     } finally {22       _jspxFactory.releasePageContext(_jspx_page_context);23     }24   }25 26   private boolean _jspx_meth_com_005fviewIP_005f0(javax.servlet.jsp.PageContext _jspx_page_context)27           throws java.lang.Throwable {28     javax.servlet.jsp.PageContext pageContext = _jspx_page_context;29     javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut();30     //  com:viewIP31     com.web.tag.ViewIPTag _jspx_th_com_005fviewIP_005f0 = (com.web.tag.ViewIPTag) _005fjspx_005ftagPool_005fcom_005fviewIP_005fnobody.get(com.web.tag.ViewIPTag.class);32     boolean _jspx_th_com_005fviewIP_005f0_reused = false;33     try {34       _jspx_th_com_005fviewIP_005f0.setPageContext(_jspx_page_context);//调用setPageContext()方法
35 _jspx_th_com_005fviewIP_005f0.setParent(null); 36 int _jspx_eval_com_005fviewIP_005f0 = _jspx_th_com_005fviewIP_005f0.doStartTag(); 37 if (_jspx_th_com_005fviewIP_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { 38 return true; 39  } 40  _005fjspx_005ftagPool_005fcom_005fviewIP_005fnobody.reuse(_jspx_th_com_005fviewIP_005f0); 41 _jspx_th_com_005fviewIP_005f0_reused = true; 42 } finally { 43  org.apache.jasper.runtime.JspRuntimeLibrary.releaseTag(_jspx_th_com_005fviewIP_005f0, _jsp_getInstanceManager(), _jspx_th_com_005fviewIP_005f0_reused); 44  } 45 return false; 46 }

 

四、 传统标签开发技术

  开发人员在编写Jsp页面时,经常还需要在页面中引入一些逻辑:

    

 

1、控制jsp页面某一部分内容是否执行

    API:

      

 

         

  •  标签实现类:TagDemo1.java     

1 package com.web.tag; 2  3 import javax.servlet.jsp.JspException; 4 import javax.servlet.jsp.tagext.TagSupport; 5  6 public class TagDemo1 extends TagSupport{ 7  8     @Override 9     public int doStartTag() throws JspException {10         11         //实际开发场景————如果有权限则输出,没有权限则不输出12         return TagSupport.EVAL_BODY_INCLUDE;13     }14     15 }

 

  • 标签声明:tld文件   

1  
2
demo1
3
com.web.tag.TagDemo1
4
JSP
5
6

tld文件类型中的四种标签体:EMPTY JSP scriptless tagdepentend

  

  • 使用标签:jsp页面   

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="http://www.sina.cn" prefix="com" %> 3  4  5    6     使用自定义标签控制jsp部分内容是否输出(标签体) 7    8       
hahaha
9 10 11 12

 

 2、控制整个jsp页面内容是否执行

    API:

      

 

 

 

  • 标签实现类:TagDemo2.java:

      

 

 

 

  • 标签声明:tld文件

1 
2
demo2
3
com.web.tag.TagDemo2
4
empty
5
6
  • 使用标签:

      

3、控制标签体重复输出

   API:

    

 

  • 标签实现类:TagDemo3

1 package com.web.tag; 2  3 import javax.servlet.jsp.JspException; 4 import javax.servlet.jsp.tagext.IterationTag; 5 import javax.servlet.jsp.tagext.Tag; 6 import javax.servlet.jsp.tagext.TagSupport; 7 //控制标签体输出5次 8 public class TagDemo3 extends TagSupport{ 9     //次数10     int x = 5;11     @Override12     public int doStartTag() throws JspException {13         return Tag.EVAL_BODY_INCLUDE;14     }15 16     @Override17     //在标签体执行完之后、结束标签之前调用18     public int doAfterBody() throws JspException {19         x--;20         if(x>0){21             return IterationTag.EVAL_BODY_AGAIN;22         }else {23             return IterationTag.SKIP_PAGE;24         }25     }26 }   

 

  • 标签声明:

1   
2
demo3
3
com.web.tag.TagDemo3
4
JSP
5

    

  • 使用标签:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="http://www.sina.cn" prefix="com" %> 3  4  5    6     使用自定义标签控制jsp部分内容是否输出(标签体) 7    8    9     
控制标签体重复输出
10 11

 

     

 4、改变标签体内容输出

     API:

       

 

  • 标签实现类:TagDemo4.java:     

1 package com.web.tag; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.BodyContent; 7 import javax.servlet.jsp.tagext.BodyTag; 8 import javax.servlet.jsp.tagext.BodyTagSupport; 9 import javax.servlet.jsp.tagext.Tag;10 11 //修改标签体内容输出12 public class TagDemo4 extends BodyTagSupport{13     14     @Override15     public int doStartTag() throws JspException {16         return BodyTag.EVAL_BODY_BUFFERED;//返回这个参数,服务器会把标签体封装成对象作为参数调用setBodyContent(BodyContent b)方法17     }18     @Override19     public int doEndTag() throws JspException {20         //得到标签体21         BodyContent bc = this.getBodyContent();22         //得到内容23         String content = bc.getString();24         //转成大写25         content = content.toUpperCase();26         27         try {28             this.pageContext.getOut().write(content);29         } catch (IOException e) {30             throw new RuntimeException(e);31         }32         33         return Tag.EVAL_PAGE;//继续输出jsp页面其他内容34     }35 }

当在doStartTag()方法中返回BodyTag.EVAL_BODY_BUFFERED参数时,服务器会把标签体内容封装成对象作为参数调用setBodyContent(BodyContent b)方法,然后在doEngTag()

中调用getBodyContent()方法返回BodyContent对象,从而得到标签体内容进行修改输出。

  • 标签声明:  

1 
2
demo4
3
com.web.tag.TagDemo4
4
JSP
5
6

 

  • 使用标签:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="http://www.sina.cn" prefix="com" %> 3  4  5    6     使用自定义标签控制jsp部分内容是否输出(标签体) 7    8       
aaaaaa
9 10 11 12

 

5、Tag接口的体系:

    

 

    

 

       

 

 

五、简单标签开发技术

  由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能。实现SimpleTag接口的标签通常称为简单标签。简单标签共定义了5个方法:

  • setJspContext方法
  • setParent和getParent方法
  • setJspBody方法
  • doTag方法

 

  API:

    

      实现类:

      

 

1、控制标签体是否执行

  • 标签实现类:SimpleTagDemo1.java:     

1 import javax.servlet.jsp.JspException; 2 import javax.servlet.jsp.tagext.JspFragment; 3 import javax.servlet.jsp.tagext.SimpleTagSupport; 4 //控制标签体是否执行 5 public class SimpleTagDemo1 extends SimpleTagSupport{ 6  7     @Override 8     public void doTag() throws JspException, IOException { 9         //获取标签体对象10         JspFragment jf = this.getJspBody();11         12             13             jf.invoke(this.getJspContext().getOut());//null也可以默认输出给浏览器14 15         16     }17 }

 

  •  标签声明:

1 
2 3
7 8
A tag library exercising SimpleTag handlers.
9
1.0
10
simple
11
/simpletag
12 13 14
15
demo1
16
com.web.simpletag.SimpleTagDemo1
17
scriptless
18
19 20

 

  • 使用标签:  

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/simpletag" prefix="simple" %> 3  4  5    6     My JSP '1.jsp' starting page 7    8    9   10        
hahaha
11 12

     

2、控制标签体重复执行

  •  标签实现类:    

1 package com.web.simpletag; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.JspFragment; 7 import javax.servlet.jsp.tagext.SimpleTagSupport; 8 //控制标签体重复执行 9 public class SimpleTagDemo2 extends SimpleTagSupport{10 11     @Override12     public void doTag() throws JspException, IOException {13         JspFragment jf = this.getJspBody();14         for(int i=0;i<5;i++){15             jf.invoke(this.getJspContext().getOut());16         }17     }18     19 }

 

  • 标签声明:  

1  
2
demo2
3
com.web.simpletag.SimpleTagDemo2
4
scriptless
5
6

 

  • 使用标签:

    

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/simpletag" prefix="simple" %> 3  4  5    6     My JSP '1.jsp' starting page 7    8    9   10        
控制标签体重复执行
11 12

 

3、修改标签体内容

  • 标签实现类:  

1 package com.web.simpletag; 2  3 import java.io.IOException; 4 import java.io.StringWriter; 5  6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.tagext.JspFragment; 8 import javax.servlet.jsp.tagext.SimpleTagSupport; 9 //修改标签体10 public class SimpleTagDemo3 extends SimpleTagSupport{11 12     @Override13     public void doTag() throws JspException, IOException {14         JspFragment jf = this.getJspBody();15         16         //带缓冲的流17         StringWriter sw = new StringWriter();18         //把标签体内容写入缓冲流中19         jf.invoke(sw);20         21         //得到标签体内容22         String content = sw.getBuffer().toString();23         24         //修改标签体25         content = content.toUpperCase();26         27         //输出28         this.getJspContext().getOut().write(content);29         30     }31 }

 

  • 标签声明:    

1 
2
demo3
3
com.web.simpletag.SimpleTagDemo3
4
scriptless
5
6

 

  • 使用标签:    

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/simpletag" prefix="simple" %> 3  4  5    6     My JSP '1.jsp' starting page 7    8    9   10        
aaaaaaaa
11 12

 

 

4、控制整个jsp页面是否输出

  • 标签实现类:       

1 package com.web.simpletag; 2  3 import java.io.IOException; 4 import java.io.StringWriter; 5  6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.SkipPageException; 8 import javax.servlet.jsp.tagext.JspFragment; 9 import javax.servlet.jsp.tagext.SimpleTagSupport;10 //控制标签余下的jsp不执行11 public class SimpleTagDemo4 extends SimpleTagSupport{12 13     @Override14     public void doTag() throws JspException, IOException {15         throw new SkipPageException();//只用向jsp页面抛出这个异常,余下的jsp不会执行16         17     }18 }

 

  • 标签声明:

        

1  
2
demo4
3
com.web.simpletag.SimpleTagDemo4
4
empty
5
6
  •  使用标签:   

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/simpletag" prefix="simple" %> 3 
4 5 6 7 My JSP '1.jsp' starting page 8 9 10 11 12 13

 

  • 5、开发带属性的标签

      

     

    在tld文件中描述属性

    

 

 

  • 标签实现类:   

1 package com.web.simpletag; 2  3 import java.io.IOException; 4 import java.io.StringWriter; 5 import java.util.Date; 6  7 import javax.servlet.jsp.JspException; 8 import javax.servlet.jsp.SkipPageException; 9 import javax.servlet.jsp.tagext.JspFragment;10 import javax.servlet.jsp.tagext.SimpleTagSupport;11 //带属性的标签12 public class SimpleTagDemo5 extends SimpleTagSupport{13     private int count;14     private Date date;//jsp只支持8种数据类型的转换15     16     public void setCount(int count) {17         this.count = count;18     }19     public void setDate(Date date) {20         this.date = date;21     }22     23     @Override24     public void doTag() throws JspException, IOException {25         //得到标签体26         JspFragment jf = this.getJspBody();27         //输出日期28         this.getJspContext().getOut().write(date.toLocaleString());29         for(int i=0;i

 

  • 标签声明:

      

1  
2
demo5
3
com.web.simpletag.SimpleTagDemo5
4
scriptless
5
6
count
7
true
8
true
9
10
11
date
12
true
13
true
14
15

 

  • 使用标签:

      

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/simpletag" prefix="simple" %> 3  4  5  6    7     My JSP '1.jsp' starting page 8    9   10   11        
12 aaaaaa13
14 15

 

6、SimpleTag接口执行顺序

    

7、JspFragment类详解

      

 

8、invoke方法详解

      

 

 六、jstl标签库

1、c:out标签

1 
-------------------c:out---------------------------
2 <%3 request.setAttribute("data", "bbb");4 %>5

 

2、c:set标签

 

1 br/>-------------------c:set可以操作给各个域  javabean Map集合的属性---------------------------
2
3
4 ${data } 5 6
7 <% 8 Person p = new Person(); 9 request.setAttribute("p", p);10 %>11
12 ${p.name }13 14
15 16 <%17 Map map = new HashMap();18 request.setAttribute("map",map);19 %>20
21 ${map.dd }22

3、c:remove标签

 

4、c:catch标签

 

1   
-------------------c:catch---------------------------
2
3 <% 4 int x = 1/0;5 %>6
7 8 ${myex.message}

 

4、c:if标签

 

 

1  
-------------------c:if---------------------------
2 3
4 aaaa5
6 ${aaa }

 

<c:if标签>只有满足test表达式的条件才会执行标签体

 

5、c:choose标签

 

 

6、c:forEach标签

 

<%         List list = new ArrayList();        list.add("aaa");        list.add("bbb");        list.add("ccc");        list.add("dddd");        request.setAttribute("list",list);    %>    
${str }
${num }

 

<c:forEach>实现表格间色显示

 

1 
-------------------c:foreach实现表格间色显示---------------------------
2 3 <% 4 list = new ArrayList(); 5 list.add("aaa"); 6 list.add("bbb"); 7 list.add("ccc"); 8 list.add("dddd"); 9 list.add("eeee");10 list.add("ffff");11 list.add("gggg");12 list.add("hhhh");13 list.add("kkkkk");14 request.setAttribute("list",list);15 %>16 <%--${status }获取到了一个对象,这个对象记住了当前是第几次迭代 --%>17 18 23 24
26
25
27
28
29 30
${str }

 

 网页源代码:

1    
-------------------c:foreach实现表格间色显示---------------------------
2 3 4 5 6 11 12
13 14
15
16
17 18
19
20
21 22
23
24
25 26
27
28
29 30
31
32
33 34
35
36
37 38
39
40
41 42
43
44
45 46
47
48
49 50
aaa
bbb
ccc
dddd
eeee
ffff
gggg
hhhh
kkkkk

 

 效果:

 

 7、c:url标签

 

构造url地址

1     
-------------------c:url标签---------------------------
2
3
4 购买5

 

 网页源代码:

 

如果url标签不带var属性,就会直接把构造地址输出给浏览器,因为没有保存,例如

1 
2 购买

不带var属性的用途:获取路径

1 购买

 

以前是通过pageContext.request.contextPath获取路径

 

 

构造地址的时候通过<c:param>附带参数,如果参数有中文,将自动对参数进行URL编码,原来的做法是:

<a href="ds.jsp?url=<%=java.net.URLEncoder.encode("编码的是这里","GB2312")%>">点击这里

1  
2
3
4 购买

 

网页源代码:

 

8、c:redirect标签

 

 

七、标签案例

1、开发防盗链标签

需求分析:如果用户不是通过本网站的首页通过点击超链接来访问某一个页面,则强制控制用户先跳转到首页

  • 标签实现类:RefererTag.java

1 package com.web.example; 2  3 import java.io.IOException; 4  5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import javax.servlet.jsp.JspException; 8 import javax.servlet.jsp.PageContext; 9 import javax.servlet.jsp.SkipPageException;10 import javax.servlet.jsp.tagext.SimpleTagSupport;11 //开发防盗链标签12 public class RefererTag extends SimpleTagSupport {13     private String site;14     public void setSite(String site) {15         this.site = site;16     }17 18     public void setPage(String page) {19         this.page = page;20     }21 22     private String page;23 24     @Override25     public void doTag() throws JspException, IOException {26         //得到pageContext对象27         PageContext pageContext = (PageContext) this.getJspContext();28         //得到request对象29         HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();30         //得到response对象31         HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();32         33         //得到来访者的referer34         String referer = request.getHeader("referer");35         System.out.println(referer);36         37         //如果是盗链38         if(referer==null||!referer.startsWith(site)){39             if(page.startsWith(request.getContextPath())){40                 //如果page是以/day11开头41                 //跳转42                 response.sendRedirect(page);43             }else if (page.startsWith("/")) {44                 //如果page以/开头45                 response.sendRedirect(request.getContextPath()+page);46             }else {47                 //如果page是index.jsp形式48                 response.sendRedirect(request.getContextPath()+"/"+page);49             }50             51             //盗链的话余下的jsp不执行,通过抛出异常52             throw new SkipPageException();53         }54     }55 }

 

  •  标签声明:

1 
5 6
A tag library exercising SimpleTag handlers.
7
1.0
8
e
9
/example
10
11
referer
12
com.web.example.RefererTag
13
empty
14 15
16
site
17
true
18
true
19
20 21
22
page
23
true
24
true
25
26
27 28 29

 

  • 首页:index.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2  3  4  5  6    7    8    9   10       点我看凤姐11     12 

 

  • 目标页面:1.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/example" prefix="e" %> 3  4 
5 6 7 My JSP '1.jsp' starting page 8 9 10 11 凤姐。。。。。。。。。。。。。。。。。凤姐12 13

 

site属性表示用户是否从site指定的地址跳转过来的,如果不是在标签实现类中跳转到page指定的页面。

 

2、开发c:if标签:jstl核心标签库有

  • 标签处理器类:IfTag.java

1 package com.web.example; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7 //开发cf标签 8 public class IfTag extends SimpleTagSupport { 9     private boolean test;10 11     public void setTest(boolean test) {12         this.test = test;13     }14     15     @Override16     public void doTag() throws JspException, IOException {17         if(test){18             this.getJspBody().invoke(null);19         }20     }21 }
  •  标签声明:

1  
2
if
3
com.web.example.IfTag
4
scriptless
5 6
7
test
8
true
9
true
10

 

  •  使用标签:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/example" prefix="c" %> 3  4  5    6     My JSP '1.jsp' starting page 7    8    9   10      
11 aaaa12
13 14

 

 

3、开发c:when和c:otherwise标签

  • 父类标签处理器类:ChooseTag.java

1 package com.web.example; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7  8 //父标签处理类 9 public class ChooseTag extends SimpleTagSupport {10 11     private boolean isDo;//记录是否被修改过12 13     public boolean isDo() {14         return isDo;15     }16 17     public void setDo(boolean isDo) {18         this.isDo = isDo;19     }20     21     22 }

 

  • c:when标签实现类:WhenTag.java

1 package com.web.example; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7  8 import sun.reflect.generics.tree.Tree; 9 //c:when标签处理器类10 public class WhenTag extends SimpleTagSupport {11     private boolean test;12 13     public void setTest(boolean test) {14         this.test = test;15     }16     17     @Override18     public void doTag() throws JspException, IOException {19         //得到父类标签20         ChooseTag parent = (ChooseTag) this.getParent();21         if(test && !parent.isDo()){22             this.getJspBody().invoke(null);23             //把isDo置为true24             parent.setDo(true);25         }26     }27 }

 

  • c:otherwise标签实现类:OtherWiseTag.java

1 package com.web.example; 2  3 import java.io.IOException; 4  5 import javax.servlet.jsp.JspException; 6 import javax.servlet.jsp.tagext.SimpleTagSupport; 7 import javax.swing.text.html.HTMLDocument.HTMLReader.ParagraphAction; 8  9 public class OtherWiseTag extends SimpleTagSupport {10 11     @Override12     public void doTag() throws JspException, IOException {13         //得到父标签14         ChooseTag parent = (ChooseTag) this.getParent();15         if(!parent.isDo()){16             this.getJspBody().invoke(null);17             parent.setDo(true);18         }19     }20 }

 

  •  标签声明:

1 
2
choose
3
com.web.example.ChooseTag
4
scriptless
//标签体内容是子标签 5
6 7
8
when
9
com.web.example.WhenTag
10
scriptless
11
12
test
13
true
14
true
15
16
17 18
19
otherwise
20
com.web.example.OtherWiseTag
21
scriptless
22
23

 

  •  使用标签:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/example" prefix="c" %> 3  4  5    6     My JSP '1.jsp' starting page 7    8    9   10      
11
12 aaaa13
14
15 bbbb16
17
18 19

 

4、开发c:foreach标签

 

  • sun公司开发的<c:forEach>部分源码:

1 protected ForEachIterator supportedTypeForEachIterator(Object o) 2     throws JspTagException 3   { 4     ForEachIterator items; 5     if (o instanceof Object[]) 6       items = toForEachIterator((Object[])o); 7     else if (o instanceof boolean[]) 8       items = toForEachIterator((boolean[])o); 9     else if (o instanceof byte[])10       items = toForEachIterator((byte[])o);11     else if (o instanceof char[])12       items = toForEachIterator((char[])o);13     else if (o instanceof short[])14       items = toForEachIterator((short[])o);15     else if (o instanceof int[])16       items = toForEachIterator((int[])o);17     else if (o instanceof long[])18       items = toForEachIterator((long[])o);19     else if (o instanceof float[])20       items = toForEachIterator((float[])o);21     else if (o instanceof double[])22       items = toForEachIterator((double[])o);23     else if (o instanceof Collection)24       items = toForEachIterator((Collection)o);25     else if (o instanceof Iterator)26       items = toForEachIterator((Iterator)o);27     else if (o instanceof Enumeration)28       items = toForEachIterator((Enumeration)o);29     else if (o instanceof Map) {30       items = toForEachIterator((Map)o);31     }32     else if (o instanceof String)33       items = toForEachIterator((String)o);34     else35       items = toForEachIterator(o);36 37     return items;38   }

 

 

  • 标签实现类:ForeachTag.java

1 package com.web.example; 2 import java.util.ArrayList; 3 import java.util.Collection; 4 import java.util.Iterator; 5 import java.util.List; 6 import java.util.Map; 7 import java.io.IOException; 8 import java.lang.reflect.Array; 9 10 import javax.servlet.jsp.JspException;11 import javax.servlet.jsp.tagext.SimpleTagSupport;12 public class ForeachTag extends SimpleTagSupport {13     private Object items;//保存需要迭代的数据14     private String var;//每次迭代的关键字声明为String类型15     private Collection collection;//把所有类型的数据转成单列集合16     public void setVar(String var) {17         this.var = var;18     }19     public void setItems(Object items) {20         this.items = items;21         if(items instanceof Collection){
//判断items是否是单列集合22 collection = (Collection) items;23 }24 25 if(items instanceof Map){26 Map map = (Map) items;27 collection = map.entrySet();//set entrySet是单列集合28 }29 30 //八种基本数据类型数组处理,用到relect反射包里面的Array对所有类型的进行处理31 if(items.getClass().isArray()){//Class类里面有一个方法判断是否是数组32 this.collection = new ArrayList();33 int length = Array.getLength(items);//reflect包中Array的方法34 //迭代35 for(int i=0;i

 

  •  标签声明:

1 
2
foreach
3
com.web.example.ForeachTag
4
scriptless
5
6
var
7
true
8
false
9
10
11
items
12
true
13
true
14
15

 

  • 使用标签:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  2 <%@taglib uri="/example" prefix="c" %>  3   4   5     6     My JSP '1.jsp' starting page  7     8     9    10      <% 11          List list = new ArrayList(); 12          list.add("aaa"); 13          list.add("bbb"); 14          list.add("ccc"); 15          list.add("ddd"); 16          list.add("eee"); 17          request.setAttribute("list", list); 18       %> 19       
20 ${str } 21
22
-------------------------
23 <% 24 Map map = new HashMap(); 25 map.put("aa", "1111"); 26 map.put("bb", "2222"); 27 map.put("cc", "3333"); 28 map.put("dd", "4444"); 29 map.put("ee", "5555"); 30 request.setAttribute("map",map); 31 %> 32
33 ${entry.key } = ${entry.value } 34
35 36
---------------------------
37 <% 38 Integer num[] = {
1,2,3}; 39 request.setAttribute("num",num); 40 %> 41 42
43 ${i } 44
45 46
----------------------------
47 48 <% 49 int arr[] = {
1,2,3}; 50 request.setAttribute("arr", arr); 51 %> 52
53 ${i } 54 55
56 57
------------------
58 <% 59 boolean b[] = {
true,false,true,true}; 60 request.setAttribute("b", b); 61 %> 62 63
64 ${i} 65
66 67
------------------------------
68 <% 69 String s[] = {
"aaa","bbb","cccc"}; 70 request.setAttribute("s",s); 71 %> 72
73 ${i} 74
75 76
-------------------------
77 <% 78 double d[] = {
2.0,3.0,4.0}; 79 request.setAttribute("d", d); 80 %> 81
82 ${i} 83
84 85 86
-------------------------
87 <% 88 float f[] = {
2,3,4}; 89 request.setAttribute("f", f); 90 %> 91
92 ${i} 93
94 95 96
-------------------------
97 <% 98 char c[] = {
'c','c','d'}; 99 request.setAttribute("c", c);100 %>101
102 ${i}103
104 105

 

通过对比可以发现,已经对要迭代的数据是八种基本数据类型的数据的代码进行了优化如下:

1         //八种基本数据类型数组处理,用到relect反射包里面的Array对所有类型的进行处理 2         if(items.getClass().isArray()){//Class类里面有一个方法判断是否是数组 3             this.collection  = new ArrayList(); 4             int length = Array.getLength(items);//reflect包中Array的方法 5             //迭代 6             for(int i=0;i

 

 5、开发html转义标签

  • 标签实现类:FilterTag.java

 

1 package com.web.example; 2  3 import java.io.IOException; 4 import java.io.StringWriter; 5  6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.tagext.JspFragment; 8 import javax.servlet.jsp.tagext.SimpleTagSupport; 9 //开发html转义标签10 public class FilterTag extends SimpleTagSupport {11     @Override12     public void doTag() throws JspException, IOException {13         //缓冲流14         StringWriter sw = new StringWriter();15         //得到标签体16         JspFragment  jf = this.getJspBody();17         //执行标签体,把标签体内容缓存到缓冲流中18         jf.invoke(sw);19         //从缓冲流中取出标签体内容进行转义20         String content = sw.getBuffer().toString();21         content = filter(content);22         //输出给浏览器23         this.getJspContext().getOut().write(content);24         25     }26     27     //tomcat转义源码28     public static String filter(String message) {29         if (message == null)30             return (null);31 32         char content[] = new char[message.length()];33         message.getChars(0, message.length(), content, 0);34         StringBuilder result = new StringBuilder(content.length + 50);35         for (int i = 0; i < content.length; i++) {36             switch (content[i]) {37             case '<':38                 result.append("<");39                 break;40             case '>':41                 result.append(">");42                 break;43             case '&':44                 result.append("&");45                 break;46             case '"':47                 result.append(""");48                 break;49             default:50                 result.append(content[i]);51             }52         }53         return (result.toString());54 55     }56 }

 

 

 

  • 标签声明

 

1 
2
filter
3
com.web.example.FilterTag
4

 

 

 

  • 使用标签

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/example" prefix="c" %> 3  4  5    6     转义标签 7    8    9   10      
11
12
13 14 </

 

 

 

  •  效果

6、将自定义开发的标签打包成jar包

新建一个java工程

 

 

把标签处理类放在src目录下:

 

 新建一个META-INF目录,存放标签描述文件:example.tld

 

 打成jar包

 

 

 

使用时直接把jar文件导入到lib目录下即可,打包的时候报错不用理会,因为源代码中用到的jsp、servlet的API没有引入。

 

转载于:https://www.cnblogs.com/niuchuangfeng/p/9123927.html

你可能感兴趣的文章
第11章 缓存机制
查看>>
GDI与GDI+ 贴图性能对比
查看>>
线段树 (扫描线)
查看>>
js、php 判断用户终端 、浏览器类型
查看>>
php函数serialize()与unserialize() 数据序列化与反序列化
查看>>
【设计模式】装饰者模式
查看>>
修改优先级(类写法)
查看>>
golang数据类型二
查看>>
给谷歌浏览器添加网页翻译插件
查看>>
Leaflet 中 删除 一个 标记(Marker)
查看>>
[翻译博文]线性隐层单元并不存在
查看>>
【ZH奶酪】为什么Python不需要函数重载?
查看>>
字节流文件拷贝工具类
查看>>
Timestamp 数据类型四舍五入引起的神奇bug
查看>>
24.如何结束返回值是void的方法
查看>>
Android 将ARGB图片转换为灰度图
查看>>
File
查看>>
廖雪峰 JavaScript 学习笔记(函数)
查看>>
公司聚餐 职场人应注意的事项
查看>>
eclipse内部Javadoc怎么汉化成中文
查看>>